using System;
using System.Threading.Tasks;

namespace JGSY.CourseManagement.Infrastructure.Messaging
{
    /// <summary>
/// 消息总线接口，定义基于发布/订阅模式的跨组件通信契约
/// </summary>
public interface IMessageBus
    {
        /// <summary>
/// 订阅指定类型的消息（同步处理）
/// </summary>
/// <typeparam name="TMessage">消息类型</typeparam>
/// <param name="handler">消息处理委托</param>
/// <param name="filter">消息过滤条件（可选），满足条件的消息才会被处理</param>
void Subscribe<TMessage>(Action<TMessage> handler, Predicate<TMessage> filter = null);
        /// <summary>
/// 订阅指定类型的消息（异步处理）
/// </summary>
/// <typeparam name="TMessage">消息类型</typeparam>
/// <param name="asyncHandler">异步消息处理委托</param>
/// <param name="filter">消息过滤条件（可选），满足条件的消息才会被处理</param>
void Subscribe<TMessage>(Func<TMessage, Task> asyncHandler, Predicate<TMessage> filter = null);
        /// <summary>
/// 取消订阅指定类型的同步消息处理器
/// </summary>
/// <typeparam name="TMessage">消息类型</typeparam>
/// <param name="handler">要取消的消息处理委托</param>
void Unsubscribe<TMessage>(Action<TMessage> handler);
        /// <summary>
/// 取消订阅指定类型的异步消息处理器
/// </summary>
/// <typeparam name="TMessage">消息类型</typeparam>
/// <param name="asyncHandler">要取消的异步消息处理委托</param>
void Unsubscribe<TMessage>(Func<TMessage, Task> asyncHandler);
        /// <summary>
/// 同步发布消息到所有匹配的订阅者
/// </summary>
/// <typeparam name="TMessage">消息类型</typeparam>
/// <param name="message">要发布的消息实例</param>
void Publish<TMessage>(TMessage message);
        /// <summary>
/// 异步发布消息到所有匹配的订阅者
/// </summary>
/// <typeparam name="TMessage">消息类型</typeparam>
/// <param name="message">要发布的消息实例</param>
/// <returns>表示异步发布操作的任务</returns>
Task PublishAsync<TMessage>(TMessage message);
    }
}